﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using BehaviorTrees;

namespace TestProject
{
	/// <summary>
	/// Summary description for DeactivatorTest
	/// </summary>
	[TestClass]
	public class DeactivatorTest : BaseTest
	{
		public DeactivatorTest()
		{
			//
			// TODO: Add constructor logic here
			//
		}

		private TestContext testContextInstance;

		/// <summary>
		///Gets or sets the test context which provides
		///information about and functionality for the current test run.
		///</summary>
		public TestContext TestContext
		{
			get
			{
				return testContextInstance;
			}
			set
			{
				testContextInstance = value;
			}
		}

		#region Additional test attributes
		//
		// You can use the following additional attributes as you write your tests:
		//
		// Use ClassInitialize to run code before running the first test in the class
		// [ClassInitialize()]
		// public static void MyClassInitialize(TestContext testContext) { }
		//
		// Use ClassCleanup to run code after all tests in a class have run
		// [ClassCleanup()]
		// public static void MyClassCleanup() { }
		//
		// Use TestInitialize to run code before running each test 
		// [TestInitialize()]
		// public void MyTestInitialize() { }
		//
		// Use TestCleanup to run code after each test has run
		// [TestCleanup()]
		// public void MyTestCleanup() { }
		//
		#endregion

		/// <summary>
		/// Tests if the deactivator decorator really deactivates the node
		/// </summary>
		[TestMethod]
		public void DeactivatiionTest()
		{
			entity = new TestEntity();
			node = new Deactivator<TestEntity>(new BehaviorTrees.Action<TestEntity>(TestEntity.IncreaseX));
			task = node.Evaluate(entity);
			task.Execute(entity, null);

			Assert.AreEqual(0, entity.x);
		}
		/// <summary>
		/// Checks if the deactivator overrides return value to success(can't return anything else cause it
		/// doesn't run anything)
		/// </summary>
		[TestMethod]
		public void DeactivatorResultTest()
		{
			entity = new TestEntity();
			node = new Deactivator<TestEntity>(new BehaviorTrees.Action<TestEntity>(TestEntity.Fail));
			task = node.Evaluate(entity);
			TaskResult result = task.Execute(entity, null);

			Assert.AreEqual(TaskResult.Success, result);
		}
	}
}
